using UnityEngine;
using System.Collections;

public class Cubos : MonoBehaviour {

	public bool grupo;
	public static bool limiteArea = false;
	private bool desceu = false;
	private bool reposicaoManual = false;
	private bool reposicaoCenario = true;

	private Vector3 screenPoint;
	private Vector3 reposicaoDir;
	private Vector3 reposicaoEsq;
	private Vector3 reposicaoCim;
	private Vector3 reposicaoBai;

	private bool inicioMovimento = false;
	private bool calcMovimento = false;
	private bool verticalMov = false;
	private bool horizontalMov = false;

	private int linha;
	private int linha_anterior;
	private int coluna;

	private bool direita = false;
	private bool esquerda = false;
	private bool cima = false;
	private bool baixo = false;

	private bool movidoDir = false;
	private bool movidoEsq = false;
	private bool movidoCim = false;
	private bool movidoBai = false;

	private bool movido = false;
	private bool emCampo = false;

	private int movDir = 0;
	private int movEsq = 0;

	private bool naoMoverCima = false;
	private bool naoMoverBaixo = false;
	private bool naoMoverEsquerda = false;
	private bool naoMoverDireita = false;

	private Vector3 currentPosStart;

	// Use this for initialization
	void Start ()
	{
		movDir = Spawner.movimentosDir;
		movEsq = Spawner.movimentosEsq;
		grupo = true;
		limiteArea = false;
	}
	
	// Update is called once per frame
	void Update ()
	{
//		if (teste == false &&
//			this.gameObject.tag == "Cubo_Azul")
//		{
//			Debug.Log ("TRUE MESMO");
//			teste = true;
//		}

		if (limiteArea && grupo)
		{
			trocaTag();

			grupo = false;
			Interaction.aceleraQueda = false;
		}

		if (grupo)
		{
			if (Interaction.aceleraQueda == false)
			{
				this.transform.Translate(0,-0.5f*Time.deltaTime,0);
			}else{
				this.transform.Translate(0,-5f*Time.deltaTime,0);
			}
		}

		if (Spawner.descida &&
			linha > 1 &&
		    Spawner.linhaVazia[linha-1] &&
		    desceu == false &&
		    Spawner.cubosDescer > 0 &&
			(this.gameObject.tag == "Cubo_Azul_Solto" ||
		     this.gameObject.tag == "Cubo_Verde_Solto" ||
		     this.gameObject.tag == "Cubo_Vermelho_Solto" ||
		     this.gameObject.tag == "Cubo_Amarelo_Solto"))
		{
			trocaTagMovimento();
			calcReposicao();
			baixo = true;
			Spawner.cubosDescer -= 1;
			desceu = true;

			Debug.Log (Spawner.cubosDescer);
			if (Spawner.cubosDescer == 0)
			{
				Spawner.descida = false;
			}
		}

		if (desceu &&
			Spawner.descida == false)
		{
			desceu = false;
		}

		if (direita ||
		    esquerda ||
		    cima ||
		    baixo)
		{
			reposicionamento ();
		}

		if (grupo && Spawner.cubosCont == 0)
		{
			if (Interaction.movDireita &&
			    movido == false &&
			    movDir > 0)
			{
				this.transform.position = new Vector3(this.transform.position.x + 0.70f,
				                                      this.transform.position.y,
				                                      this.transform.position.z);
				movDir -= 1;
				movEsq += 1;
				Spawner.moveCont -= 1;
				movido = true;
				MovInicio ();
			}
			if (Interaction.movEsquerda &&
			    movido == false &&
			    movEsq > 0)
			{
				this.transform.position = new Vector3(this.transform.position.x - 0.70f,
				                                      this.transform.position.y,
				                                      this.transform.position.z);
				movDir += 1;
				movEsq -= 1;
				Spawner.moveCont -= 1;
				movido = true;
				MovInicio ();
			}
			if (Spawner.moveCont == 0)
			{
				Interaction.movDireita = false;
				Interaction.movEsquerda = false;
				Spawner.moveCont = 4;
			}
			if (Interaction.movEsquerda == false && Interaction.movDireita == false)
			{
				movido = false;
			}
		}

		// DESTRUIR BLOCO
		// ==============
		if (Spawner.verificar[linha] == true &&
		    this.gameObject.tag == "Cubo_Azul_Solto")
		{
			Destroy (this.gameObject);
			Spawner.cuboAzulcont[linha] -= 1;

			if (Spawner.cuboAzulcont[linha] == 0)
			{
				Spawner.verificar[linha] = false;
				Spawner.tempoLinhas[linha] = 0f;
				Spawner.linhaVazia[linha] = true;

				Spawner.cuboVerdecont[linha] = 0;
				Spawner.cuboVermelhocont[linha] = 0;
				Spawner.cuboAmarelocont[linha] = 0;
			}
		}
		if (Spawner.verificar[linha] == true &&
		    this.gameObject.tag == "Cubo_Verde_Solto")
		{
			Destroy (this.gameObject);
			Spawner.cuboVerdecont[linha] -= 1;

			
			if (Spawner.cuboVerdecont[linha] == 0)
			{
				Spawner.verificar[linha] = false;
				Spawner.tempoLinhas[linha] = 0f;
				Spawner.linhaVazia[linha] = true;

				Spawner.cuboAzulcont[linha] = 0;
				Spawner.cuboVermelhocont[linha] = 0;
				Spawner.cuboAmarelocont[linha] = 0;
			}
		}
		if (Spawner.verificar[linha] == true &&
		    this.gameObject.tag == "Cubo_Vermelho_Solto")
		{
			Destroy (this.gameObject);
			Spawner.cuboVermelhocont[linha] -= 1;

			
			if (Spawner.cuboVermelhocont[linha] == 0)
			{
				Spawner.verificar[linha] = false;
				Spawner.tempoLinhas[linha] = 0f;
				Spawner.linhaVazia[linha] = true;

				Spawner.cuboAzulcont[linha] = 0;
				Spawner.cuboVerdecont[linha] = 0;
				Spawner.cuboAmarelocont[linha] = 0;
			}
		}
		if (Spawner.verificar[linha] == true &&
		    this.gameObject.tag == "Cubo_Amarelo_Solto")
		{
			Destroy (this.gameObject);
			Spawner.cuboAmarelocont[linha] -= 1;
			
			if (Spawner.cuboAmarelocont[linha] == 0)
			{
				Spawner.verificar[linha] = false;
				Spawner.tempoLinhas[linha] = 0f;
				Spawner.linhaVazia[linha] = true;

				Spawner.cuboAzulcont[linha] = 0;
				Spawner.cuboVerdecont[linha] = 0;
				Spawner.cuboVermelhocont[linha] = 0;
			}
		}

//		if (Input.touchCount > 0)
//		{
//			//Ray2D ray = Camera.main.ScreenPointToRay (Input.GetTouch(0).position);
//			Ray2D ray = Camera.main.ScreenPointToRay (Input.mousePosition);
//			RaycastHit2D hit;
//
//			if (Physics2D.Raycast (ray, hit))
//			{
//				Debug.Log (hit.collider.gameObject.name);
//			}
//		}
	}

	void trocaTag()
	{
		if (this.gameObject.tag == "Cubo_Azul" ||
		    this.gameObject.tag == "Cubo_Mov_Azul")
		{
			this.gameObject.tag = "Cubo_Azul_Solto";
		}
		if (this.gameObject.tag == "Cubo_Verde" ||
		    this.gameObject.tag == "Cubo_Mov_Verde")
		{
			this.gameObject.tag = "Cubo_Verde_Solto";
		}
		if (this.gameObject.tag == "Cubo_Vermelho" ||
		    this.gameObject.tag == "Cubo_Mov_Vermelho")
		{
			this.gameObject.tag = "Cubo_Vermelho_Solto";
		}
		if (this.gameObject.tag == "Cubo_Amarelo" ||
		    this.gameObject.tag == "Cubo_Mov_Amarelo")
		{
			this.gameObject.tag = "Cubo_Amarelo_Solto";
		}
	}

	void trocaTagMovimento()
	{
		if (this.gameObject.tag == "Cubo_Azul_Solto")
		{
			this.gameObject.tag = "Cubo_Mov_Azul";
		}
		if (this.gameObject.tag == "Cubo_Verde_Solto")
		{
			this.gameObject.tag = "Cubo_Mov_Verde";
		}
		if (this.gameObject.tag == "Cubo_Vermelho_Solto")
		{
			this.gameObject.tag = "Cubo_Mov_Vermelho";
		}
		if (this.gameObject.tag == "Cubo_Amarelo_Solto")
		{
			this.gameObject.tag = "Cubo_Mov_Amarelo";
		}
	}

	void trocaTagCair()
	{
		if (this.gameObject.tag == "Cubo_Azul_Solto")
		{
			this.gameObject.tag = "Cubo_Azul";
		}
		if (this.gameObject.tag == "Cubo_Verde_Solto")
		{
			this.gameObject.tag = "Cubo_Verde";
		}
		if (this.gameObject.tag == "Cubo_Vermelho_Solto")
		{
			this.gameObject.tag = "Cubo_Vermelho";
		}
		if (this.gameObject.tag == "Cubo_Amarelo_Solto")
		{
			this.gameObject.tag = "Cubo_Amarelo";
		}
	}

	void reposicionamento()
	{
		//Movimentaçao
		if (this.gameObject.tag == "Cubo_Mov_Azul" ||
		    this.gameObject.tag == "Cubo_Mov_Verde" ||
		    this.gameObject.tag == "Cubo_Mov_Vermelho" ||
		    this.gameObject.tag == "Cubo_Mov_Amarelo")
		{
			//Puxar e soltar
			if (reposicaoManual == false)
			{
				if (direita)
				{
					if (this.transform.position.x < reposicaoDir.x)
					{
						this.transform.Translate(2f*Time.deltaTime,0,0);
					}else{
						direita = false;
						trocaTag();
						reposicaoCenario = true;
					}
				}
				if (esquerda)
				{
					if (this.transform.position.x > reposicaoEsq.x)
					{
						this.transform.Translate(-2f*Time.deltaTime,0,0);
					}else{
						esquerda = false;
						trocaTag();
						reposicaoCenario = true;
					}
				}
				if (cima)
				{
					if (this.transform.position.y < reposicaoCim.y)
					{
						this.transform.Translate(0,2f*Time.deltaTime,0);
					}else{
						cima = false;
						trocaTag();
						reposicaoCenario = true;
					}
				}
				if (baixo)
				{
					if (this.transform.position.y > reposicaoBai.y)
					{
						this.transform.Translate(0,-2f*Time.deltaTime,0);
					}else{
						baixo = false;
						trocaTag();
						reposicaoCenario = true;
					}
				}
			// Puxar e segurar
			}else{
				if (direita)
				{
					if (this.transform.position.x < reposicaoDir.x)
					{
						this.transform.Translate(2f*Time.deltaTime,0,0);
					}else{
						direita = false;
						trocaTag();
						MovInicio ();
						reposicaoCenario = true;
					}
				}
				if (esquerda)
				{
					if (this.transform.position.x > reposicaoEsq.x)
					{
						this.transform.Translate(-2f*Time.deltaTime,0,0);
					}else{
						esquerda = false;
						trocaTag();
						MovInicio ();
						reposicaoCenario = true;
					}
				}
				if (cima)
				{
					if (this.transform.position.y < reposicaoCim.y)
					{
						this.transform.Translate(0,2f*Time.deltaTime,0);
					}else{
						cima = false;
						trocaTag();
						MovInicio ();
						reposicaoCenario = true;
					}
				}
				if (baixo)
				{
					if (this.transform.position.y > reposicaoBai.y)
					{
						this.transform.Translate(0,-2f*Time.deltaTime,0);
					}else{
						baixo = false;
						trocaTag();
						MovInicio ();
						reposicaoCenario = true;
					}
				}
			}
		}
	}

	void OnTriggerEnter2D (Collider2D other)
	{
		if (other.gameObject.tag == "Limite_Cima")
		{
			naoMoverCima = true;
		}
		if (other.gameObject.tag == "Limite_Baixo")
		{
			naoMoverBaixo = true;
		}
		if (other.gameObject.tag == "Limite_Esquerdo")
		{
			naoMoverEsquerda = true;
		}
		if (other.gameObject.tag == "Limite_Direito")
		{
			naoMoverDireita = true;
		}

		if ((this.gameObject.tag == "Cubo_Azul" ||
		     this.gameObject.tag == "Cubo_Verde" ||
		     this.gameObject.tag == "Cubo_Vermelho" ||
		     this.gameObject.tag == "Cubo_Amarelo") &&
		    other.gameObject.tag == "Cubo_Base")
		{
			if (emCampo == false)
			{
				Spawner.cubosCont -= 1;
				Spawner.cubosDescendo += 1;
				emCampo = true;
			}
		}

		if (((this.gameObject.tag == "Cubo_Azul" ||
		      this.gameObject.tag == "Cubo_Verde" ||
		      this.gameObject.tag == "Cubo_Vermelho" ||
		      this.gameObject.tag == "Cubo_Amarelo") &&
		     (other.gameObject.tag == "Chao" ||
		      other.gameObject.tag == "Cubo_Azul_Solto" ||
		 	  other.gameObject.tag == "Cubo_Verde_Solto" ||
		 	  other.gameObject.tag == "Cubo_Vermelho_Solto" ||
		 	  other.gameObject.tag == "Cubo_Amarelo_Solto")))
		{
			//Debug.Log ("TRUE MESMO");

			limiteArea = true;
			Spawner.cubosDescendo = 0;
			Spawner.cubosCaindo = false;
			Spawner.tempo = 0;
			this.rigidbody2D.gravityScale = 0.0f;
			reposicaoCenario = true;
		}

		if ((this.gameObject.tag == "Cubo_Azul_Solto" ||
		     this.gameObject.tag == "Cubo_Verde_Solto" ||
		     this.gameObject.tag == "Cubo_Vermelho_Solto" ||
		     this.gameObject.tag == "Cubo_Amarelo_Solto") &&
		    (other.gameObject.tag == "Cubo_Mov_Azul" ||
		 	 other.gameObject.tag == "Cubo_Mov_Verde" ||
		 	 other.gameObject.tag == "Cubo_Mov_Vermelho" ||
		 	 other.gameObject.tag == "Cubo_Mov_Amarelo"))
		{
			calcReposicao();

			if (this.transform.position.x < other.transform.position.x)
			{
				trocaTagMovimento();
				direita = true;
			}
			else if (this.transform.position.x > other.transform.position.x)
			{
				trocaTagMovimento();
				esquerda = true;
			}
			else if (this.transform.position.y < other.transform.position.y)
			{
				trocaTagMovimento();
				cima = true;
			}
			else if (this.transform.position.y > other.transform.position.y)
			{
				trocaTagMovimento();
				baixo = true;
			}
		}
	}

	void OnTriggerExit2D (Collider2D other)
	{
		if (other.gameObject.tag == "Limite_Cima")
		{
			naoMoverCima = false;
		}
		if (other.gameObject.tag == "Limite_Baixo")
		{
			naoMoverBaixo = false;
		}
		if (other.gameObject.tag == "Limite_Esquerdo")
		{
			naoMoverEsquerda = false;
		}
		if (other.gameObject.tag == "Limite_Direito")
		{
			naoMoverDireita = false;
		}
	}

	void OnTriggerStay2D (Collider2D other)
	{
		if ((this.gameObject.tag == "Cubo_Azul_Solto" ||
			 this.gameObject.tag == "Cubo_Verde_Solto" ||
			 this.gameObject.tag == "Cubo_Vermelho_Solto" ||
			 this.gameObject.tag == "Cubo_Amarelo_Solto")
		   	 && other.gameObject.tag == "Cubo_Base"
		     && reposicaoCenario)
		{
			this.transform.position = other.transform.position;

			if (linha_anterior != linha)
			{
				linha_anterior = linha;
			}

			for (int i = 0; i < 13; i++)
			{
				if (this.transform.position.y == Spawner.arrayPosCubosY[i])
				{
					linha = Spawner.arrayLinhas[i];
				}
			}

			for (int i = 0; i < 6; i++)
			{
				if (this.transform.position.x == Spawner.arrayPosCubosX[i])
				{
					coluna = Spawner.arrayColunas[i];
				}
			}

			reposicaoCenario = false;

			//Debug.Log (linha);
			//Debug.Log ("AFF! Funcionou!");
			if (linha_anterior != linha)
			{
				Spawner.cuboAzulcont[linha_anterior] -= 1;
				Spawner.contarLinha(linha_anterior);

				Spawner.cuboAzulcont[linha] += 1;
				Spawner.contarLinha(linha);
			}
		}
	}

	void MovInicio()
	{
			if (this.gameObject.tag == "Cubo_Azul_Solto" ||
			    this.gameObject.tag == "Cubo_Verde_Solto" ||
			    this.gameObject.tag == "Cubo_Vermelho_Solto" ||
			    this.gameObject.tag == "Cubo_Amarelo_Solto")
			{
			screenPoint = Camera.main.WorldToScreenPoint (gameObject.transform.position);
			inicioMovimento = true;
			calcMovimento = true;
			reposicaoManual = true;
			direita = false;
			esquerda = false;
			cima = false;
			baixo = false;
			trocaTagMovimento();
		}
		if (grupo)
		{
			screenPoint = Camera.main.WorldToScreenPoint (gameObject.transform.position);
			inicioMovimento = true;
			calcMovimento = true;
		}
	}

	void calcReposicao()
	{
		reposicaoDir = new Vector3(this.transform.position.x + 0.70f,
		                           this.transform.position.y,
		                           this.transform.position.z);
		reposicaoEsq = new Vector3(this.transform.position.x - 0.70f,
		                           this.transform.position.y,
		                           this.transform.position.z);
		reposicaoCim = new Vector3(this.transform.position.x,
		                           this.transform.position.y + 0.70f,
		                           this.transform.position.z);
		reposicaoBai = new Vector3(this.transform.position.x,
		                           this.transform.position.y - 0.70f,
		                           this.transform.position.z);
	}

	void OnMouseDown()
	{
		Spawner.calcular = true;
		MovInicio ();
	}

	void OnMouseDrag()
	{
		if (this.gameObject.tag == "Cubo_Mov_Azul" ||
			this.gameObject.tag == "Cubo_Mov_Verde" ||
			this.gameObject.tag == "Cubo_Mov_Vermelho" ||
			this.gameObject.tag == "Cubo_Mov_Amarelo")
		{
			Vector3 currentScreenPoint = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
			Vector3 currentPos = Camera.main.ScreenToWorldPoint (currentScreenPoint);

			// Grava posiçao do primeiro clique
			if (inicioMovimento)
			{
				currentPosStart = currentPos;

				calcReposicao();

				inicioMovimento = false;
			}

			// Detecçao de Direçao
			if (calcMovimento)
			{
				// Direita
				if (naoMoverDireita == false)
				{
					if (currentPos.x > currentPosStart.x)
					{
						if((currentPos.x - currentPosStart.x) >= 0.5f &&
						   verticalMov == false &&
						   movidoDir == false)
						{
							direita = true;
							cima = false;
							baixo = false;
							calcMovimento = false;
							horizontalMov = true;
							movidoDir = true;
							movidoEsq = false;
						}
					}
				}
				// Esquerda
				if (naoMoverEsquerda == false)
				{
					if (currentPos.x < currentPosStart.x)
					{
						if((currentPosStart.x - currentPos.x) >= 0.5f &&
						   verticalMov == false &&
						   movidoEsq == false)
						{
							esquerda = true;
							cima = false;
							baixo = false;
							calcMovimento = false;
							horizontalMov = true;
							movidoEsq = true;
							movidoDir = false;
						}
					}
				}
				// Cima
				if (naoMoverCima == false)
				{
					if (currentPos.y > currentPosStart.y)
					{
						if((currentPos.y - currentPosStart.y) >= 0.5f &&
						   horizontalMov == false &&
						   movidoCim == false)
						{
							cima = true;
							direita = false;
							esquerda = false;
							calcMovimento = false;
							verticalMov = true;
							movidoCim = true;
							movidoBai = false;
						}
					}
				}
				// Baixo
				if (naoMoverBaixo == false)
				{
					if (currentPos.y < currentPosStart.y)
					{
						if((currentPosStart.y - currentPos.y) >= 0.5f &&
						   horizontalMov == false &&
						   movidoBai == false)
						{
							baixo = true;
							direita = false;
							esquerda = false;
							calcMovimento = false;
							verticalMov = true;
							movidoBai = true;
							movidoCim = false;
						}
					}
				}
			}

			//Vector3 currentScreenPoint = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
			//Vector3 currentPos = Camera.main.ScreenToWorldPoint (currentScreenPoint);
			//transform.position = currentPos;
		}



		// Detecçao de Direçao de Cubos em Grupo
		if (calcMovimento && grupo)
		{
			Vector3 currentScreenPoint = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
			Vector3 currentPos = Camera.main.ScreenToWorldPoint (currentScreenPoint);
			
			// Grava posiçao do primeiro clique
			if (inicioMovimento)
			{
				currentPosStart = currentPos;
				inicioMovimento = false;
			}
			
			// Direita
			if (currentPos.x > currentPosStart.x)
			{
				if((currentPos.x - currentPosStart.x) >= 0.5f && movDir > 0)
				{
					Interaction.movEsquerda = false;
					Interaction.movDireita = true;
					calcMovimento = false;
				}
			}
			// Esquerda
			if (currentPos.x < currentPosStart.x)
			{
				if((currentPosStart.x - currentPos.x) >= 0.5f && movEsq > 0)
				{
					Interaction.movDireita = false;
					Interaction.movEsquerda = true;
					calcMovimento = false;
				}
			}
			// Baixo
			if (currentPos.y < currentPosStart.y)
			{
				if((currentPosStart.y - currentPos.y) >= 2.0f)
				{
					Interaction.movDireita = false;
					Interaction.movEsquerda = false;
					Interaction.aceleraQueda = true;
					calcMovimento = false;
				}
			}
		}
	}

	// Soltar Mouse / Terminar Toque na tela
	void OnMouseUp()
	{
		if (this.gameObject.tag == "Cubo_Mov_Azul" ||
			this.gameObject.tag == "Cubo_Mov_Verde" ||
			this.gameObject.tag == "Cubo_Mov_Vermelho" ||
			this.gameObject.tag == "Cubo_Mov_Amarelo")
		{
			reposicaoManual = false;
			calcMovimento = false;
			inicioMovimento = false;
			horizontalMov = false;
			verticalMov = false;
			movidoDir = false;
			movidoEsq = false;
			movidoCim = false;
			movidoBai = false;

			if (direita == false && esquerda == false
			    && cima == false && baixo == false)
			{
				trocaTag();
			}
		}

		Interaction.movDireita = false;
		Interaction.movEsquerda = false;
		movido = false;
		Spawner.calcular = false;
	}
}
